<?php defined('BASE_PATH') or die('No direct script access.');
class router {
    private $registry;
    private $path; // thuộc tính chứa đường dẫn cho thư mục controller
    public $file; // Thuộc tính chứa đường dẫn file controller
    public $controller; // Thuộc tính chứa giá trị controller được gọi đến trên url
    public $action; // thuộc tính chưa giá trị action được gọi đến trên url
    public $admin;
    public function __construct($registry) {
        $this->registry = $registry;
    }
    //Khởi tạo hàm setPath để thiết lập đường dẫn cho Controller
    public function setPath($path) {
        // Kiểm tra đường dẫn có tồn tại không
        if(is_dir($path) == FALSE) {
            throw new Exception ('Invalid controller path: `' . $path . '`');
        }
        // Thiết lập đường dẫn cho thuộc tính path
        $this->path = $path;
    }
    public function loader() {
        $this->getController();
        // Kiểm tra sự tồn tại của file controller
        if(is_readable($this->file) == FALSE) {
            $this->notFound('no-file');
        }
        /*** nạp file controller ***/
        include $this->file;
        /*** Khởi tạo các object thuộc các class controller ***/
        $class = $this->controller . 'Controller';
        $controller = new $class($this->registry);
        /*** Kiểm tra sự tồn tại của router action
		và methods tồn tại trong mỗi class controller ***/
        if (is_callable(array($controller, $this->action)) == false) {
            $this->notFound('no-file');
        }
        else {
            $action = $this->action;
        }
        /*** chạy action ***/
        $controller->$action();
    }

    private function getController() {
        /*** lấy router từ url ***/
        if(empty($_GET['rt'])) {
            $route = null;
        }else {
            $route = $_GET['rt'];
        }
        if(empty($route)) {
            $route = 'index';
        }else {
            /*** tách chuỗi route (vd: index.php?rt=user/login) thành các phần tử mảng
			phân cách mỗi thành phần bởi dấu (/) ***/
            $parts = explode('/', $route);
            $admin=ADMIN;
            // kiểm tra xem có admin ko
            if($parts[0]==$admin) {
                $this->admin=TRUE;
                if(isset($parts[1])) {
                    $this->controller = $parts[1];
                }else {
                    $this->controller = NULL;
                }
                if(isset( $parts[2])) {
                    $this->action = $parts[2];
                }
            }else {
                //contrlller khi khong có admin
                $this->controller = $parts[0];
                if(isset( $parts[1])) {
                    $this->action = $parts[1];
                }
            }
        }
        if(empty($this->controller)) {
            $this->controller = 'index';
        }
        if(empty($this->action)) {
            $this->action = 'index';
        }
        $this->registry->template->module=$this->controller;
        /*** set the file path ***/
        if(empty($this->admin)) {
            include LIBRARY.'FE_Controller.php';
            $this->registry->template->template=LAYOUT_FRONTEND;
            $this->file = $this->path .'/'. $this->controller .'/controllers/Controller.php';
        }else {
            // nap contrller trong folder admin
            include LIBRARY.'BE_Controller.php';
            $this->registry->template->template=LAYOUT_BACKEND;
            $this->file = $this->path .'/'. $this->controller .'/controllers/admin/Controller.php';
        }
    }

    private function notFound() {
       // die("404 Not Found");
        redirect(BASE_URL.'errors/404.php');
    }
}
?>